package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.consts.ResultDO;
import com.arpa.wms.domain.dto.*;
import com.arpa.wms.domain.entity.DeliveryDistribution;
import com.arpa.wms.domain.entity.Outbound;
import com.arpa.wms.domain.entity.WmsTask;
import com.arpa.wms.domain.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 出库单 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface IOutboundService extends IService<Outbound> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(Outbound entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(Outbound entity);

    /**
     * 查询列表
     * @param outboundDTO
     * @return
     */
    List<OutboundVO> queryList(OutboundDTO outboundDTO);

    /**
     * 查询合计,包含总数
     * @param outboundDTO
     * @return
     */
    OutboundVO queryListTotal(OutboundDTO outboundDTO);

    /**
     * 单条出库确认使用
     * @param outbound
     */
    Result outCheck(Outbound outbound);

    OutboundVO getVOByCode(String code);

    OutboundVO getVOWithRegisterByCode(String code);

    /**
     * 更新出库单下发状态
     * @param sourceCode
     */
    void updateIssueStatus(String sourceCode);

    /**
     * @description
     * PC端复核出库单
     * @author xuyang
     * @date 2020/10/28 8:15
     * @param outboundVO:
     **/
    Result PCRecheck(OutboundVO outboundVO);

    /**
     * @description
     * PDA端复核
     * @author xuyang
     * @date 2020/10/28 17:17
     * @param registerDTO:
     **/
    PdaSwitchPageVO pdaSingleRecheck(OutboundRegisterDTO registerDTO);

    /**
     * @description
     * PDA缺货登记
     * @author xuyang
     * @date 2020/10/29 9:59
     * @param registerDTO:
     **/
    PdaSwitchPageVO stockout(OutboundRegisterDTO registerDTO);

    /**
     * 一周内所有仓库的出库数量
     * @return
     */
    List<Map<String, Object>> outboundCount(List<String> warehouseCodes,List<String> shipmentCodes,String groupCode);

    /**
     * @description
     * PDA查询复核列表
     * @author xuyang
     * @date 2020/12/10 15:52
     * @param registerDTO:
     **/
    WmsTaskVO pdaRecheckList(OutboundRegisterDTO registerDTO, WmsTask task);

    /**
     * @description
     * PDA查询复核列表(非按单)
     * @author xuyang
     * @date 2020/12/10 15:52
     * @param registerDTO:
     **/
    WmsTaskVO pdaRecheckListForQuantity(OutboundRegisterDTO registerDTO,WmsTask task);

    /**
     * @description
     * PDA查询复核详细信息（非按单）
     * @author xuyang
     * @date 2020/12/10 16:02
     * @param registerDTO:
     **/
    Result pdaRecheckDetail(OutboundRegisterDTO registerDTO);

    /**
     * @description
     * PDA查询复核详细信息（按单）
     * @author xuyang
     * @date 2020/12/10 16:02
     * @param registerDTO:
     **/
    Result pdaRecheckDetailForQuantity(OutboundRegisterDTO registerDTO);



    /**
     * 根据波次号和库存code查询发货分配信息
     * @param query
     * @return
     */
    List<DeliveryDistributionVO> queryDistributionsByInventoryCodeAndWavePickingCode(DeliveryDistributionDTO query);

    /**
     * @description
     * PC端批量复核出库单
     * @param outboundVO:
     **/
    void batchRecheck(OutboundVO outboundVO);

    List<DeliveryVO> printExpress(List<String> outboundCodes);

    /**
     * 查询出库单信息
     */
    OutboundVO getOutboundInfo(String outboundCode);

    /**
     * @description
     * PDA端(单品单个、单品多个、多品)复核
     * @author rfwang
     * @date 2021/05/07 13:10
     * @param vo
     **/
    PdaSwitchPageVO pdaSingleDeliveryRecheck(DeliveryItemWithDistributionVO vo);

    /**
     * @description
     * 单品单件、单品多件、多品复核缺货登记
     * @author rfwang
     * @date 2021/05/07 13:10
     * @param vo
     **/
    PdaSwitchPageVO deliveryStockout(DeliveryItemWithDistributionVO vo);

    /**
     * 根据出库单的计划数量和（复核数量+复核缺货数量）关系更新出库单复核数量和状态
     * @author rfwang
     * @date 2021/5/21 12:13
     * @param code 出库单号
     *@param  recheckQuantity 复核数量
     *@param oldInventoryCode 原库存
     */
    int updateOutboundQuantityAndStatus(String code,  BigDecimal recheckQuantity,String oldInventoryCode,String groupCode);



    /**
     * 查询预打包单复核信息
     * @author rfwang
     * @date 2021年7月10日
     * @param wavePickingCode 波次号
     */
    OutboundVO getPrepackagedOutboundInfo(String wavePickingCode,String orderTag);

    /**
     * pda预打包确认
     *
     * @param wavePickingCode 波次号
     * @author rfwang
     * @date 2021年7月12日
     */
    PdaSwitchPageVO pdaPrepackagedRecheckCheck(String wavePickingCode);

    /**
     * pda预打包缺货登记
     *
     * @param wavePickingCode 波次号
     * @param deliveryDTOList 订单列表
     * @author rfwang
     * @date 2021年7月9日
     */
    PdaSwitchPageVO prepackagedStockout(String wavePickingCode, List<DeliveryDTO> deliveryDTOList, Integer planPickQuantity, Integer pickQuantity);

    /**
     * @description
     * PDA端爆品复核
     * @author rfwang
     * @date 2021年7月15日
     * @param registerDTO:
     **/
    PdaSwitchPageVO hotReviewCheck(OutboundRegisterDTO registerDTO);

    /**
     * 更新出库单的复核数量和状态
     * @author rfwang/authorize
     * @date 2021年7月16日
     *@param wavePickingCode 波次号
     */
    int updateRecheckQuantityByWavePickingCode(String wavePickingCode);

    /**
     * @description
     * PDA端爆品缺货复核
     * @author rfwang
     * @date 2021年7月16日
     * @param entitys 分配明细:
     * @param wavePickingCode 波次号:
     * @param inventoryCode 库存号:
     **/
    PdaSwitchPageVO hotRecheckStockout(List<DeliveryDistribution> entitys, String wavePickingCode, String inventoryCode);


    /**
     * 出库确认并处理取消订单
     * @author liuxr
     * @date 2021/11/25 14:49
     * @param outbound
     * @return com.arpa.core.web.Result
     */
    Result outCheckAndHandelCancelDelivery(Outbound outbound);

    /**
     * 根据订单号获取出库单号
     * @author rfwang
     * @date 2022/03/11
     * @param deliveryCodes
     * @param groupCode
     */
    List<String> getOutboundCodesByDeliveryCodes(Set<String> deliveryCodes,String groupCode);

    /**
     * @description
     * PDA端按面单复核
     * @author rfwang
     * @date 2022/03/16 10:10
     * @param deliveryItemDTO
     **/
    PdaSwitchPageVO recheckByWaybillCode(DeliveryItemDTO deliveryItemDTO);

    /**
     * 根据出库单的计划数量和（复核数量+复核缺货数量）关系更新出库单复核数量和状态
     * @author rfwang
     * @date 2022/3/16 13:13
     * @param code 出库单号
     * @param outboundItemCode 出库明细单号
     *@param  recheckQuantity 复核数量
     *@param  groupCode 组织机构
     */
    int updateQuantityAndStatus(String code,String outboundItemCode,  BigDecimal recheckQuantity,String groupCode);


}
